/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Model.CidadeModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Diego
 */
public class CidadeDao {

    public static final int cNavPrimeiro = 0;
    public static final int cNavAnterior = 1;
    public static final int cNavProximo = 2;
    public static final int cNavUltimo = 3;

    public static void Salvar(CidadeModel cidade) {
        Connection conexao = FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;

        String sql = "insert into cidade (COD_CIDADE, NOME_CIDADE, ESTADO_CIDADE, CEP_CIDADE)"
                + "values(?,?,?,?);";
        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cidade.getCodCidade());
            insereSt.setString(2, cidade.getNomeCidade());
            insereSt.setString(3, cidade.getEstadoCidade());
            insereSt.setString(4, cidade.getCepCidade());

            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public static void Alterar(CidadeModel cidade) {

        Connection conexao = FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;
        String sql = "update cidade set COD_CIDADE=?, NOME_CIDADE=?, ESTADO_CIDADE=?, CEP_CIDADE=? where COD_CIDADE=" + cidade.getCodCidade();

        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cidade.getCodCidade());
            insereSt.setString(2, cidade.getNomeCidade());
            insereSt.setString(3, cidade.getEstadoCidade());
            insereSt.setString(4, cidade.getCepCidade());
            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public static CidadeModel RecuperarCidade(int Cod) {

        Connection conexao = FabricaConexao.GeraConexao();
        CidadeModel cidadeRecuperado = new CidadeModel();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "select * from cidade where COD_CIDADE=" + Cod;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);
            resultado.next();

            cidadeRecuperado.setCodCidade(resultado.getInt("COD_CIDADE"));
            cidadeRecuperado.setNomeCidade(resultado.getString("NOME_CIDADE"));
            cidadeRecuperado.setEstadoCidade(resultado.getString("ESTADO_CIDADE"));
            cidadeRecuperado.setCepCidade(resultado.getString("CEP_CIDADE"));


        } catch (SQLException ex) {
            Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        return cidadeRecuperado;
    }

 /*   public static List<CidadeModel> RecuperaObjts(String cidade) {
        Connection conexao = FabricaConexao.GeraConexao();
        List<CidadeModel> cid = new ArrayList<CidadeModel>();
        try {
            Statement objSTM = conexao.createStatement();
            objSTM.executeQuery("SELECT COD_CIDADE, NOME_CIDADE, ESTADO_CIDADE, CEP_CIDADE FROM cidade WHERE NOME_CIDADE like '%" + cidade + "%'");
            ResultSet objResultSet = objSTM.getResultSet();
            while (objResultSet.next()) {
                CidadeModel c = new CidadeModel();
                String vID = objResultSet.getString("COD_CIDADE");
                String vNome = objResultSet.getString("NOME_CIDADE");
                String vEstado = objResultSet.getString("ESTADO_CIDADE");
                String vCep = objResultSet.getString("CEP_CIDADE");

                c.setCodCidade(Integer.parseInt(vID));
                c.setNomeCidade(vNome);
                c.setEstadoCidade(vEstado);
                c.setCepCidade(vCep);

                cid.add(c);
            }
            objResultSet.close();
            objSTM.close();
        } catch (Exception erro) {
            String errorMsg = "Erro ao Recuperar: " + erro.getMessage();
            JOptionPane.showMessageDialog(null, errorMsg, "Mensagem", JOptionPane.ERROR_MESSAGE);
        }
        return cid;
    }
*/
    public static int PegaCodPelaNavegacao(int iopcao, int iCodAtual) {

        Connection conexao = FabricaConexao.GeraConexao();
        Statement consulta = null;
        ResultSet resultado = null;
        int CodEncontrado = -1;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(CidadeDao.SQLNavegacao(iopcao, iCodAtual));
            resultado.next();
            CodEncontrado = resultado.getInt("COD");
        } catch (SQLException ex) {
            Logger.getLogger(FabricaConexao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(FabricaConexao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return CodEncontrado;


    }

    public static String SQLNavegacao(int iopcao, int iCodAtual) {
        String sql = "";
        switch (iopcao) {
            case cNavPrimeiro:
                sql = " select min(COD_CIDADE) as COD from cidade ";
                break;
            case cNavAnterior:
                sql = " select max(COD_CIDADE) as COD from cidade where COD_CIDADE <" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavProximo:
                sql = " select min(COD_CIDADE) as COD from cidade where COD_CIDADE >" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavUltimo:
                sql = " select max(COD_CIDADE) as COD from cidade ";
                break;
        }
        return sql;
    }

    public static void Excluir(int CodAtual) {

        FabricaConexao.Excluir(CodAtual, "cidade", "COD_CIDADE");


    }

    public static List<CidadeModel> RecuperaCidades(String sql) {
        Connection conexao = FabricaConexao.GeraConexao();
        List<CidadeModel> cid = new ArrayList<CidadeModel>();
        
        try {
            Statement objSTM = conexao.createStatement();

           

            objSTM.executeQuery(sql);
            ResultSet objResultSet = objSTM.getResultSet();
            while (objResultSet.next()) {
                CidadeModel c = new CidadeModel();
                String vID = objResultSet.getString("COD_CIDADE");
                String vNome = objResultSet.getString("NOME_CIDADE");
                String vEstado = objResultSet.getString("ESTADO_CIDADE");
                String vCep = objResultSet.getString("CEP_CIDADE");

                c.setCodCidade(Integer.parseInt(vID));
                c.setNomeCidade(vNome);
                c.setEstadoCidade(vEstado);
                c.setCepCidade(vCep);

                cid.add(c);
            }
            objResultSet.close();
            objSTM.close();
        } catch (Exception erro) {
            String errorMsg = "Erro ao Recuperar: " + erro.getMessage();
            JOptionPane.showMessageDialog(null, errorMsg, "Mensagem", JOptionPane.ERROR_MESSAGE);
        }
        return cid;
    }

    public static CidadeModel RecuperaCidade(String get) {
        Connection conexao = FabricaConexao.GeraConexao();
        CidadeModel cidadeRecuperado = new CidadeModel();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "select * from cidade where NOME_CIDADE='" + get + "'";
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);
            resultado.next();

            cidadeRecuperado.setCodCidade(resultado.getInt("COD_CIDADE"));
            cidadeRecuperado.setNomeCidade(resultado.getString("NOME_CIDADE"));
            cidadeRecuperado.setEstadoCidade(resultado.getString("ESTADO_CIDADE"));
            cidadeRecuperado.setCepCidade(resultado.getString("CEP_CIDADE"));


        } catch (SQLException ex) {
            Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(CidadeDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return cidadeRecuperado;
    }

    public static ArrayList<CidadeModel> PesquisaObjeto(String NomeCampo, String Valor, boolean EmQualquerParte) {
        String sql = "select * from cidade where " + NomeCampo + " like '";
        if(EmQualquerParte){
            sql=sql + "%";
        }
        sql = sql + Valor + "%'";
        
        return (ArrayList<CidadeModel>) RecuperaCidades(sql);
        
    }
}
